home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 4
/
United Public Domain Gold 4.iso
/
fredfish
/
ff.0431.dms
/
ff.0431.adf
/
A68Kex
/
load.asm
< prev
next >
Wrap
Assembly Source File
|
1991-01-17
|
6KB
|
255 lines
***************************************
* LOAD from disk *
* *
* written by E. Lenz *
* Johann-Fichte-Strasse 11 *
* 8 Munich 40 *
* Germany *
* *
***************************************
XDEF load,file
********LOAD SECTOR ABSOLUTE***********
; INPUT
; d0 Pointer to disk buffer
; d1 Sector number
; d2 Unit number
; a0 Pointer to sector number in ASCII
;
*****EXEC**************
_AbsExecBase equ 4
_LVOAllocMem equ -$c6
_LVOAddPort equ -$162
_LVORemPort equ -$168
_LVOCloseLibrary equ -$19e
_LVOOpenDevice equ -$1bc
_LVOCloseDevice equ -$1c2
_LVODoIo equ -$1c8
_LVOOpenLibrary equ -$228
*******DOS******
_LVOOpen equ -$1e
_LVOClose equ -$24
_LVORead equ -$2a
_LVOWrite equ -$30
_LVOOutput equ -$3c
_LVOLock equ -$54
_LVOUnLock equ -$5a
_LVOExamine equ -$66
_LVOLoadSeg equ -$96
_LVOUnLoadSeg equ -$9c
ThisTask equ $114
load move.l a0,-(a7)
move.w d1,-(a7)
move.l d2,-(a7)
movea.l d0,a5
movea.l _AbsExecBase,a6
move.l ThisTask(a6),reply+$10
lea reply(pc),a1 add reply port
jsr _LVOAddPort(a6)
move.l (a7)+,d0 unit number
moveq #0,d1 flags
lea trddevice(pc),a0 device name
lea diskio(pc),a1 iorequest
jsr _LVOOpenDevice(a6)
tst.l d0
bne error
lea diskio(pc),a1
move.l #reply,$e(a1)
move.w #2,$1c(a1) command read
move.l a5,d0
addi.l #$10,d0
move.l d0,$28(a1)
move.l #$400,$24(a1)
moveq #0,d0 trackdisk offset sector number * 512
move.w (a7)+,d0
mulu #512,d0
move.l d0,$2c(a1)
jsr _LVODoIo(a6) get sectors
lea diskio(pc),a1
move.w #9,$1c(a1) command motor off
clr.l $24(a1)
jsr _LVODoIo(a6)
lea reply(pc),a1
jsr _LVORemPort(a6) remove reply port
lea diskio(pc),a1
jsr _LVOCloseDevice(a6)
movea.l a5,a1 write SECTOR
lea Sector(pc),a0
moveq #3,d0
loop1 move.l (a0)+,(a1)+
dbra d0,loop1
movea.l a5,a1 write sector number
adda.l #7,a1
movea.l (a7)+,a0
loop2 move.b (a0)+,d0
cmpi.b #$a,d0
beq.s next
move.b d0,(a1)+
bra.s loop2
next movea.l a5,a1 write *******
adda.l #$410,a1
lea SecNum(pc),a0
moveq #3,d0
loop3 move.l (a0)+,(a1)+
dbra d0,loop3
bra.s fin
error move.w (a7)+,d0
movea.l (a7)+,a0
suba.l a0,a0
fin rts
*********************
* Load file
*
* IN:
* a0 Pointer to null terminated filename
*
* OUT:
* d7 <> 0 if error
* a3 Pointer to begin of file
*
*********************
file move.l a0,-(a7)
suba.l a5,a5
suba.l a4,a4
moveq #10,d7
movea.l _AbsExecBase,a6 load dos.library
lea DosName(pc),a1
moveq #0,d0
jsr _LVOOpenLibrary(a6)
movea.l d0,a6
tst.l d0
beq.s err
************************************
*
* try to load the file as a program
*
************************************
move.l (a7),d1
jsr _LVOLoadSeg(a6)
tst.l d0
beq.s text
move.l d0,d1
add.l d0,d0
add.l d0,d0
addq.l #4,d0
movea.l d0,a3
jsr _LVOUnLoadSeg(a6)
move.l (a7)+,d1
moveq #0,d7
bra.s nounlock
************************************
*
* now try to load the file as text
*
************************************
text move.l (a7),d1 get lock
moveq #-2,d2
jsr _LVOLock(a6)
move.l d0,d1
movea.l d0,a5
beq.s err
suba.l #$104,a7
move.l a7,d2
jsr _LVOExamine(a6)
tst.l d0
beq.s err
move.l $7c(a7),d0
adda.l #$104,a7
move.l d0,d5
beq.s err
move.l a6,-(a7)
moveq #0,d1 Any type of memory
movea.l _AbsExecBase,a6
jsr _LVOAllocMem(a6)
movea.l (a7)+,a6
movea.l d0,a3
beq.s err
move.l (a7),d1
move.l #$3ed,d2
jsr _LVOOpen(a6)
movea.l d0,a4
move.l d0,d1
beq.s err
move.l a3,d2
move.l d5,d3
jsr _LVORead(a6)
cmp.l d0,d3
bne.s err
moveq #0,d7
bra.s errend
err moveq #1,d7
errend move.l (a7)+,d0
move.l a4,d1
beq.s noclose
jsr _LVOClose(a6)
noclose move.l a5,d1
beq.s nounlock
jsr _LVOUnLock(a6)
nounlock movea.l a6,a1 Close dos.library
beq.s nolib
move.l _AbsExecBase,a6
jsr _LVOCloseLibrary(a6)
nolib rts
DosName dc.b 'dos.library',0
trddevice dc.b 'trackdisk.device',0
even
diskio dc.l 0 +0 successor
dc.l 0 +4 predecessor
dc.b 0,0 +8 type,priority
dc.l 0 +a pointer to device name
dc.l 0 +e reply port
dc.w reply-diskio +12 node length
dc.l 0 +14 io-device
dc.l 0 +18 io-unit
dc.w 0 +1c io-command
dc.b 0,0 +1e flags,error
dc.l 0 +20 actual no of bytes
dc.l 0 +24 requested no of bytes
dc.l 0 +28 pointer to buffer
dc.l 0 +2c offset
reply dc.l 0,0,0,0,0,0,0,0
Sector dc.b 'SECTOR *'
SecNum dc.b '****************'
end